package com.example.myapplication;

import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import com.example.myapplication.bean.Photo;
import com.example.myapplication.bean.User;

import java.util.ArrayList;
import java.util.List;

// 定义有关SQLite数据库的相关操作的类
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    // 数据库名称
    private static final String DA_NAME = "mySQLite.db";
    private static final int DATABASE_VERSION = 10;  // 增加版本号
    // User 表名称及建表语句
    private static final String TABLE_NAME_USERS = "users";
    // 创建用户表
    private static final String CREATE_TABLE_USERS =
            "create table " + TABLE_NAME_USERS +
                    " (id integer primary key autoincrement, name text, number text, number_fin text);";

    // Photo 表名称及建表语句
    private static final String TABLE_NAME_PHOTOS = "photos";
    // 创建图片表
    private static final String CREATE_TABLE_PHOTOS =
            "CREATE TABLE IF NOT EXISTS photos (" +
                    "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    "name TEXT NOT NULL, " +
                    "picture TEXT" +
                    ")";


    // 构造函数
    public MySQLiteOpenHelper(Context context) {
        super(context, DA_NAME, null, DATABASE_VERSION);
    }

    // 当数据库首次创建时调用，执行建表语句
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE_USERS);  // 创建 student 表
        db.execSQL(CREATE_TABLE_PHOTOS);       // 创建 food 表
        Log.d("DB", "photos 数据库表创建成功");
    }

    // =================== User 表操作方法 ===================
    /**
     * 插入一条用户信息
     * @param user 要插入的 User 对象
     * @return 新记录的行号（若返回 -1 表示插入失败）
     */
    public long insertData(User user) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", user.getName());
        values.put("number", user.getNumber());
        values.put("number_fin", user.getNumber_fin());
        return db.insert(TABLE_NAME_USERS, null, values);
    }

    /**
     * 根据姓名查询用户数据
     * @param name 查询条件，用户姓名
     * @return 符合条件的 User 对象集合
     */
    // 1、先找到数据库对象
    // 2、再创建一个list用户类列表
    // 3、然后通过数据库处理类库的方法db.query()获取cursor数据库游标，类似于C的数组首地址
    // 4、接着通过游标循环遍历获取相应属性对应的相应的值，并创建student对象set设置相应的值
    // 5、最后list用户类列表添加学生student对象
    // 6、关闭游标，关闭数据库
    public List<User> queryFromDbByName(String name) {
        SQLiteDatabase db = getWritableDatabase();
        List<User> userList = new ArrayList<>();
        // 使用 ? 占位符防止 SQL 注入
        Cursor cursor = db.query(TABLE_NAME_USERS, null, "name=?", new String[]{name}, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                @SuppressLint("Range") String name1 = cursor.getString(cursor.getColumnIndex("name"));
                @SuppressLint("Range") String number = cursor.getString(cursor.getColumnIndex("number"));
                User user = new User();
                user.setName(name1);
                user.setNumber(number);
                userList.add(user);
            }
            cursor.close();
        }
        return userList;
    }

    // 预留
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 数据库升级逻辑
        db.execSQL("DROP TABLE IF EXISTS photos");
        onCreate(db);
    }

    // =================== Photo 表操作方法 ===================

    /**
     * 插入一条食物信息到 photos 表中
     * @param photo 要插入的 Photo 对象
     * @return 新记录的行号，若返回 -1 表示插入失败
     */
    public long insertPhoto(Photo photo) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", photo.getName()); // 添加图片名称
        values.put("picture", photo.getPicture()); // 添加图片数据

        long result = db.insert("photos", null, values);
        db.close();
        return result;
    }

    /**
     * 查询所有图片信息
     * @return Photo 对象的集合
     */
    public List<Photo> queryAllPhoto() {
        SQLiteDatabase db = getReadableDatabase();
        List<Photo> photoList = new ArrayList<>();
        Cursor cursor = db.query(TABLE_NAME_PHOTOS, null, null, null, null, null, "store_date desc");
        if (cursor != null) {
            while (cursor.moveToNext()) {
                Photo photo = new Photo();
                // 获取每一列的数据
                photo.setId(cursor.getInt(cursor.getColumnIndexOrThrow("id")));
                photo.setName(cursor.getString(cursor.getColumnIndexOrThrow("name")));
                photo.setPicture(cursor.getString(cursor.getColumnIndexOrThrow("picture")));
                photoList.add(photo);
            }
            cursor.close();
        }
        return photoList;
    }

    /**
     * 根据 photos 表中记录的 id 删除对应的记录
     * @param id 照片记录的 id
     * @return 删除的记录数，若为 0 表示未删除成功
     */
    // 根据照片id删除照片表的相应的id的那行照片元组
    public int deletePhotoById(int id) {
        SQLiteDatabase db = getWritableDatabase();
        return db.delete(TABLE_NAME_PHOTOS, "id=?", new String[]{String.valueOf(id)});
    }

    // 查询所有图片
    // 遍历图片表的每行数据元组
    public List<Photo> getAllPhoto() {
        List<Photo> photoList = new ArrayList<>();
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = null;

        try {
            cursor = db.rawQuery("SELECT * FROM photos", null);
            while (cursor.moveToNext()) {
                Photo photo = new Photo();
                photo.setId(cursor.getInt(cursor.getColumnIndexOrThrow("id")));
                photo.setName(cursor.getString(cursor.getColumnIndexOrThrow("name")));
                photo.setPicture(cursor.getString(cursor.getColumnIndexOrThrow("picture")));
                photoList.add(photo);
            }
        } catch (Exception e) {
            Log.e("DB_ERROR", "查询图片数据失败", e);
        } finally {
            if (cursor != null) cursor.close();
            db.close();
        }
        return photoList;
    }

    // 在 MySQLiteOpenHelper 类中添加这个方法
    public int deleteAllPhotos() {
        SQLiteDatabase db = getWritableDatabase();
        return db.delete(TABLE_NAME_PHOTOS, null, null);
    }

}
